﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Elysium.Demo;
using SIIE_ERP.BaseDatos;
using SIIE_ERP.Codigo;
using SIIE_ERP.Codigo.Ventas;
using SIIE_ERP.View;

namespace Elysium.Demo.PuntoVenta.Transacciones
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class Factura_Alta : UserControl
    {
        UsuarioActivo _sesion;

        public Factura_Alta(ref UsuarioActivo usuario)
        {
            InitializeComponent();
            this._sesion = usuario;
            CargarCatalogos();
            CargarPartidas();
        }

        private void CargarPartidas()
        {
            listaPartidas = new List<CPartida>();
            PartidasDataGrid.ItemsSource = listaPartidas;
        }

        private void ButtonInformacion_Click_1(object sender, RoutedEventArgs e)
        {
            WindowAyuda Ayuda = new Elysium.Demo.WindowAyuda("Facturacion.htm", "Ayuda");
            Ayuda.Owner = SIIE_ERP.View.NavegacionUI.GetParentWindow(this); Ayuda.ShowDialog();
        }

        private void CargarCatalogos()
        {
            ComboBoxUI.ComboFormaPago(ref ComboFormaPago, _sesion);
            ComboBoxUI.ComboMetodoPago(ref ComboMetodoPago, _sesion);
            ComboBoxUI.ComboClientes_AutoComplete_SoloClientes(ref ComboClientes, _sesion, "");
        }

        List<CPartida> listaPartidas;
       
        class CPartida
        {
            public string Numero { get; set; }
            public string Importe { get; set; }
            public string Eliminar { get { return "Eliminar";  } }
            public CPartida(string Numero, string Importe)
            {
                this.Numero = Numero;
                this.Importe = Importe;
            }
        }

        // Agregar ticket a las partidas
        private void Button_Guardar_Click(object sender, RoutedEventArgs e)
        {
            if (CampoNumeroTicket.Text.Length > 0)
            {
                var db = new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName);
                var ticket = db.Get_Ticket_Por_Secuencia(CampoNumeroTicket.Text);

                if (ticket.Rows.Count > 0)
                {
                    var t = ticket.Rows[0] as DataRow;

                    // Verificamos que no exista ya el elemento
                    foreach (CPartida p in listaPartidas)
                    {
                        if (p.Numero.Equals(t["Id_Ticket"].ToString()))
                        {
                            MessageBox.Show("Este ticket ya esta en la lista.");
                            return;
                        }
                    }
                    listaPartidas.Add(new CPartida(t["Id_Ticket"].ToString(), t["Total"].ToString()));
                    PartidasDataGrid.Items.Refresh();
                    CampoNumeroTicket.Text = "";
                }
                else
                {
                    MessageBox.Show("El número de ticket que usted ingreso no existe.");
                }
            }
            else
            {
                MessageBox.Show("Debe ingresar un número de ticket.");
            }
        }

        private void EliminarPartida_Click(object sender, RoutedEventArgs e)
        {
            var rowSelected = PartidasDataGrid.SelectedIndex;
            if (rowSelected < 0) return;

            if (MessageBox.Show("¿Esta seguro de eliminar este registro?", "Eliminar", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
            {
                listaPartidas.RemoveAt(rowSelected);
                PartidasDataGrid.Items.Refresh();
            }            
        }
        
        private void Button_CrearFactura_Click(object sender, RoutedEventArgs e)
        {
            try
            {

           
            if (!Valida()) return;

            var Pesos = new SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_Moneda(_sesion.RFC, _sesion.UserName)
                                    .Get_Moneda_Por_Nombre("Pesos Mexicanos").Rows[0]["Id_Moneda"].ToString();

            var PrimerTicket = listaPartidas.ElementAt(0).Numero;
            var PrimerTerminal = new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName)
                                                        .Get_Ticket_Por_Id(PrimerTicket).Rows[0]["Id_Terminal"].ToString();           

            var Sucursal = new SIIE_ERP.BaseDatos.PuntoVenta.Catalogos.dbo_Cat_Terminal(_sesion.RFC, _sesion.UserName)
                                                        .Get_Terminal_Por_Id(Int32.Parse(PrimerTerminal)).Rows[0]["Id_Sucursal"].ToString();

            var Almacen = new SIIE_ERP.BaseDatos.PuntoVenta.Catalogos.dbo_Cat_Terminal(_sesion.RFC, _sesion.UserName)
                                                        .Get_Terminal_Por_Id(Int32.Parse(PrimerTerminal)).Rows[0]["Id_Almacen"].ToString();
            var Serie = new SIIE_ERP.BaseDatos.Configuracion.dbo_Cat_Sucursal(_sesion.RFC, _sesion.UserName)
                                    .Get_Sucursal_Por_Id(Int32.Parse(Sucursal)).Rows[0]["Id_Serie"].ToString();

            var Aux = new DocumentosVentasClass(_sesion.UserName, _sesion.RFC);

            if (Aux.AltaDocumento(
                    Documentos_Id.Doc_FacturaCliente,
                    Int32.Parse(ComboClientes.SelectedValue.ToString()),
                    Int32.Parse(Pesos),
                    Int32.Parse(Almacen),
                    -1,
                    -1,
                    Int32.Parse(Sucursal),
                    Int32.Parse(ComboFormaPago.SelectedValue.ToString()),
                    Int32.Parse(ComboMetodoPago.SelectedValue.ToString()),
                    Int32.Parse(Serie),
                    DateTime.Now.Date,
                    DateTime.Now.Date,
                    DateTime.Now.Date,
                    "",
                    "",
                    CampoComentarios.Text,
                    ""
                ).Id == 1)
            {
                // Una vez creada la factura, hay que dar de alta todos los elementos de los tickets.
                var IdFactura = new SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_Ventas(_sesion.RFC, _sesion.UserName)
                                                .Get_Ultima_Factura();

                foreach (CPartida partida in listaPartidas) // Para cada ticket...
                {
                    // Obtenemos los elementos de cada uno de los tickets

                    var elementos = new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName)
                                                                .Get_Partidas_Ticket_Por_Id(partida.Numero).Rows;

                    foreach (DataRow p in elementos)
                    {
                        var IdElemento = Int32.Parse(p["Id_Articulo"].ToString());
                        var Cantidad = Double.Parse(p["Cantidad"].ToString());
                        var PrecioUnitario = Double.Parse(p["Precio_Unitario"].ToString());
                        var PorcDescuento = Double.Parse(p["Porc_Descuento"].ToString());
                        var Descuento = Double.Parse(p["Descuento"].ToString());
                        var PorcImpuesto = Double.Parse(p["Porc_Impuesto"].ToString());
                        var Impuesto = Double.Parse(p["Impuesto"].ToString());
                        var Subtotal = Double.Parse(p["SubTotal"].ToString());
                        var PrecioTotal = Double.Parse(p["Precio_Total"].ToString());

                        SIIE_ERP.BaseDatos.Documentos_Lineas.Insert_Linea(
                                                _sesion.RFC,
                                                _sesion.UserName,
                                                IdFactura,
                                                Documentos_Id.Doc_FacturaCliente,
                                                IdElemento, // Aqui va el id del elemento
                                                Cantidad, // Aqui va la cantidad
                                                PrecioUnitario, // Precio Unitario
                                                PorcDescuento, // Porcentaje descuento
                                                Descuento, // Descuento
                                                PorcImpuesto, // Porc impuesto
                                                Impuesto, // Impuesto
                                                Subtotal, // Precio sub total
                                                PrecioTotal, // Total
                                                "Ticket: " + p["Id_Ticket"].ToString());
                    }
                }
                MessageBox.Show("Factura creada correctamente.");
                (this.Parent as ScrollViewer).Content = null;
            }
            else
            {
                MessageBox.Show("Error al crear la factura.");
            }
            }
            catch (Exception)
            {

                MessageBox.Show("Error al crear la factura.");
                return;
            }
        }

        private bool Valida()
        {
            if (ComboClientes.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar un cliente."); return false;
            }
            if (ComboFormaPago.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar una forma de pago."); return false;
            }
            if (ComboMetodoPago.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar un método de pago."); return false;
            }
            if (listaPartidas.Count == 0)
            {
                MessageBox.Show("Debe agregar al menos un ticket."); return false;
            }
            return true;
        }

        private void Button_Imprimir_Click(object sender, RoutedEventArgs e)
        {

        }

        private void Button_DescargarFactura_Click(object sender, RoutedEventArgs e)
        {

        }
        
        private void ButtonRegresar_Click(object sender, RoutedEventArgs e)
        {
            (this.Parent as ScrollViewer).Content = null;
        }
    }
}
